﻿using System;
using System.Collections.Generic;
using System.Linq;

using PortalIntranet.DatabaseComponents;
using PortalIntranet.DatabaseComponents.Administracao;
using PortalIntranet.ObjectComponents.Comun;

namespace PortalIntranet.BusinessComponents.Administracao
{
	public class DepartamentosBll
	{
		public static Departamento Obter(int id)
		{
			using (var contexto = new IntranetContexto())
			{
				return contexto.Departamentos
					.Include("Empresa")
					.Include("DepartamentoPai")
					.Where(c => c.Id == id
						&& !c.Desativado
						&& !c.Excluido)
					.SingleOrDefault();
			}
		}

		public static List<Departamento> ListarDepartamentos(int empresa)
		{
			using (var contexto = new IntranetContexto())
			{
				return contexto.Departamentos
					.Where(c => c.EmpresaId == empresa
						&& !c.Desativado
						&& !c.Excluido)
					.OrderBy(o => o.Ordem)
					.ToList();
			}
		}

		public static UriInfo ObterUri(Departamento departamento)
		{
			Departamento pai = null;
			string nome = string.Empty;
			string slug = string.Empty;
			if (departamento == null) return null;
			WebPage principal = WebPagesBll.ObterPrincipal(departamento.Id);

			if (principal != null)
			{
				nome = string.Format("{0}/{1}", departamento.Nome, principal.Nome);
				slug = departamento.Slug;
				slug = string.Format("{0}?wpg={1}", departamento.Slug, principal.Slug);
				pai = departamento.DepartamentoPai;

				using (var contexto = new IntranetContexto())
				{
					while (pai != null)
					{
						var item = contexto.Departamentos
							.Include("DepartamentoPai")
							.Where(c => c.Id == pai.Id
								&& !c.Desativado
								&& !c.Excluido)
							.SingleOrDefault();

						if (item == null) break;
						nome = string.Format("{0}/{1}", item.Nome, nome);
						slug = string.Format("{0}/{1}", item.Slug, slug);
						pai = item.DepartamentoPai;
					};
				}
			}

			return new UriInfo(slug, nome);
		}

		public static Departamento Obter(string slug, int empresa)
		{
			using (var contexto = new IntranetContexto())
			{
				return contexto.Departamentos
					.Include("Empresa")
					.Include("DepartamentoPai")
					.Where(c => c.Slug.ToUpper() == slug.ToUpper()
						&& c.EmpresaId == empresa
						&& !c.Desativado
						&& !c.Excluido)
					.SingleOrDefault();
			}
		}

		public static Departamento ObterHome(int empresa)
		{
			using (var contexto = new IntranetContexto())
			{
				return contexto.Departamentos
					.Include("Empresa")
					.Include("DepartamentoPai")
					.Where(c => c.Home
						&& c.EmpresaId == empresa
						&& !c.Desativado
						&& !c.Excluido)
					.SingleOrDefault();
			}
		}
	}
}
